package interfaceUsuario;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

import persistencia.Emprestimo;
import persistencia.Livro;
import persistencia.Usuario;
import regrasNegocio.RegrasNegocio;

// Interface de Usuário do GeBA
public class GeBAIU{
	
	// Definição de variáveis
	private final String TITULO_PROGRAMA	= "GeBA: Gerenciador de Bibliotecas Automatizado";

	private final int OP_EMPRESTIMO_LIVRO	= 1;
	private final int OP_DEVOLUCAO_LIVRO	= 2;

	private final int OP_CADASTRO_USUARIO	= 1;
	private final int OP_LISTAGEM_USUARIO	= 2;

	private final int OP_SAIR_PROGRAMA		= 0;
	private final int OP_MENU_ANTERIOR		= 99;
	
	
	// Monta a estrutura visual para administracao da Biblioteca
	public void montaInterface() {

		Scanner input = new Scanner(System.in);

		//Configura o sistema para utilizacao do Sepador de linha como o mesmo do SO
		input.useDelimiter(System.getProperty("line.separator"));
				
		int opcao = 0;
		
		do {
			opcao = menuPrincipal(input);
		} while (opcao != OP_SAIR_PROGRAMA);

		System.out.println("Obrigado por usar o sistema.");
	}
	
	// Imprime uma série de linhas em branco para "limpar" a tela
	public void limpaTela() {
		for(int i = 0; i < 20 ; i++) {
			System.out.println("\n");
		}
	}
	
	// Fica aguardando o usuário pressionar a tecla <ENTER> para prosseguir
	private void aguardaConfirmacao(Scanner input) {

		System.out.println("Pressione <ENTER> para continuar...");
		extraiOpcaoString(input);
		limpaTela();
		
	}

	// Extrai qualquer inteiro digitado no menu	 
	private int extraiOpcaoInteiro(Scanner input) {
		
		int retorno = -1;
		
		try {
			retorno = input.nextInt();
		} catch (Exception ex) {
			input.nextLine();
			retorno = -1;
		}
		
		return retorno;
		
	}	

	// Extrai qualquer string digitada no menu
	private String extraiOpcaoString(Scanner input) {
		
		String retorno = "";
		
		try {
			retorno = input.next();
		} catch (Exception ex) {
			input.nextLine();
			retorno = "";
		}
		
		return retorno;
		
	}


	// Estrutura do menu principal de administração
	private int menuPrincipal(Scanner input){
		
		int opcao = -1;
		
		do {
		
			System.out.println();
			System.out.println("+-----------------------------------------------+");
			System.out.println("| " + TITULO_PROGRAMA + " |");
			System.out.println("+-----------------------------------------------+");
			System.out.println();
			System.out.println("1 - Empréstimo de Livros");
			System.out.println("2 - Devolução de Livros");
			System.out.println();
			System.out.println("+-----------------------------------------------+");
			System.out.println("| 0 - Sair do Programa                          |");
			System.out.println("+-----------------------------------------------+");
			
			opcao = extraiOpcaoInteiro(input); 
				
			switch (opcao) {
				case OP_EMPRESTIMO_LIVRO:
					limpaTela();
					opcao = iniciaEmprestimoLivro(input);
					limpaTela();
					break;
				case OP_DEVOLUCAO_LIVRO:
					opcao = iniciaDevolucaoLivro(input);
					limpaTela();
					break;
				case OP_SAIR_PROGRAMA:
				case OP_MENU_ANTERIOR:
					break;
				default:
					opcao = -1;
					break;
			}
		
		} while (opcao == -1);

		return opcao;
		
	} 

	// Menu com opções para gerenciar os usuários
	private int menuUsuario(Scanner input){

		int opcao = -1;
		
		RegrasNegocio rn = new RegrasNegocio();

		limpaTela();

		do {

			System.out.println();
			System.out.println("+-----------------------------------------------+");
			System.out.println("| " + TITULO_PROGRAMA + " |");
			System.out.println("+-----------------------------------------------+");
			System.out.println();
			System.out.println("1 - Cadastrar Usuário");
			System.out.println("2 - Listar Usuários");
			System.out.println();
			System.out.println("+-----------------------------------------------+");
			System.out.println("| 99 - Voltar ao menu anterior                  |");
			System.out.println("| 0 - Sair do Programa                          |");
			System.out.println("+-----------------------------------------------+");
			
			opcao = extraiOpcaoInteiro(input);
				
			switch (opcao) {
				case OP_CADASTRO_USUARIO:
					iniciaCadastroUsuario(input);
					limpaTela();
					break;
				case OP_LISTAGEM_USUARIO:
					System.out.println("+-----------------------------------------------+");
					System.out.println("| Usuários cadastrados no sistema:              |");
					System.out.println("+-----------------------------------------------+");
					rn.listarUsuarios();
					aguardaConfirmacao(input);
					break;
				case OP_SAIR_PROGRAMA:
				case OP_MENU_ANTERIOR:
					break;
				default:
					opcao = -1;
					break;
			}
		
		} while (opcao == -1);

		return opcao;
	}

	// Método para realização de empréstimo
	private int iniciaEmprestimoLivro(Scanner input) {
		
		boolean existeUsuario;
		int opcao 					= -1;
		Livro livroEmprestimo		= new Livro();
		Usuario usuarioEmprestimo	= new Usuario();
		RegrasNegocio rn 			= new RegrasNegocio();
	
		//Informa da Matricula do Usuario
		System.out.println("+-----------------------------------------------+");
		System.out.println("| Digite a matrícula do usuário:                |");
		System.out.println("+-----------------------------------------------+");
		usuarioEmprestimo.setMatriculaUsuario(extraiOpcaoInteiro(input));
		
		//Verifica a existencia do usuario
		existeUsuario = rn.verificaExistenciaUsuario(Integer.toString(usuarioEmprestimo.getMatriculaUsuario()));

		//Caso exista, procede para o emprestimo
		if ( existeUsuario ) {

			System.out.println("+-----------------------------------------------+");
			System.out.println("| Usuário encontrado!                           |");
			System.out.println("| Escolha um livro para realizar empréstimo:    |");
			System.out.println("+-----------------------------------------------+");
			
			// Listagem dos livros
			rn.listarLivros();
			
			// Configua o objeto Livros
			livroEmprestimo.setMatriculaLivro(extraiOpcaoInteiro(input));
			
			// Funcao de emprestimo de livros
			rn.emprestarLivros(usuarioEmprestimo, livroEmprestimo);
			
			aguardaConfirmacao(input);
			
		} else {

			System.out.println("+-----------------------------------------------+");
			System.out.println("| O usuário não existe.                         |");
			System.out.println("| É preciso realizar um cadastro.               |");
			System.out.println("+-----------------------------------------------+");
			aguardaConfirmacao(input);
			opcao = menuUsuario(input);
		}

		return opcao;
		
	}

	// Método para realização de empréstimo
	private int iniciaDevolucaoLivro(Scanner input) {
		
		int opcao = -1;
		boolean existeUsuario;
		
		RegrasNegocio rn			= new RegrasNegocio();
		Emprestimo emprestimo		= new Emprestimo( new Usuario(), new Livro() );

		//Captura as informacoes de usuario
		System.out.println("+-----------------------------------------------+");
		System.out.println("| Digite a matrícula do usuário:                |");
		System.out.println("+-----------------------------------------------+");
		emprestimo.getUsuarioEmprestimo().setMatriculaUsuario(extraiOpcaoInteiro(input));
		
		//Validacao para existencia do usuario
		existeUsuario = rn.verificaExistenciaUsuario(Integer.toString(emprestimo.getUsuarioEmprestimo().getMatriculaUsuario()));
		
		if ( existeUsuario ) {

			String livros = rn.listarEmprestimos(emprestimo.getUsuarioEmprestimo());
			
			// Se não houver livros emprestados...
			if ( livros.isEmpty() ){
				// ... emite um aviso ...
				System.out.println("+-----------------------------------------------+");
				System.out.println("| Não há empréstimos para esse usuário.         |");
				System.out.println("+-----------------------------------------------+");
				aguardaConfirmacao(input);

			}else{

				System.out.println("+-----------------------------------------------+");
				System.out.println("| Listando os empréstimos do usuário...         |");
				System.out.println("+-----------------------------------------------+");
				
				System.out.println(livros);

				// Configua o objeto Livros
				System.out.println("+-----------------------------------------------+");
				System.out.println("| Qual livro vai devolver?                      |");
				System.out.println("+-----------------------------------------------+");
				emprestimo.getLivroEmprestimo().setMatriculaLivro(extraiOpcaoInteiro(input));
				
				//Data formatada
				Date dataEntrega = null;
				DateFormat formatador;
				formatador	= new SimpleDateFormat("dd/MM/yyyy");
				
				System.out.println("+-----------------------------------------------+");
				System.out.println("| Digite a data de entrega:                     |");
				System.out.println("+-----------------------------------------------+");
				String data = extraiOpcaoString(input);
				
				//Transforma a String dd/MM/yyyy em um objeto tipo Date
				try {
					
					dataEntrega = formatador.parse(data);
				
				} catch (Exception e) {
					e.printStackTrace();
				}

				//Funcao de emprestimo de livros
				rn.devolverLivros(emprestimo);
				
				// Configura a data de devolução
				emprestimo.setDataDevolucao(dataEntrega);
				
				// Calcula a possível multa
				double multa = Emprestimo.calcularMulta(emprestimo);
				
				if ( multa != 0.0) {
					
					System.out.println("+-----------------------------------------------+");
					System.out.printf("Há um multa a ser paga no valor de: R$ %.2f \n", multa);
					System.out.println("+-----------------------------------------------+");
				
				}else{
					
					System.out.println("+-----------------------------------------------+");
					System.out.println("| Livro Devolvido com sucesso                   |");
					System.out.println("+-----------------------------------------------+");
				}

				aguardaConfirmacao(input);
			}
		} else {
			
			limpaTela();
			System.out.println("+-----------------------------------------------+");
			System.out.println("| O usuário não existe no Sistema.              |");
			System.out.println("| Tente pesquisar por outro usuário.            |");
			System.out.println("+-----------------------------------------------+");
			aguardaConfirmacao(input);
			
			// TODO: Voltar diretamente para o menu de devolução?

		}

		return opcao;
		
	}

	public int iniciaCadastroUsuario(Scanner input) {
		
		int opcao = -1;
		
		Usuario usuario		= new Usuario();
		RegrasNegocio rn	= new RegrasNegocio();
		System.out.println("+-----------------------------------------------+");
		System.out.println("| Digite o nome do usuário novo:                |");
		System.out.println("+-----------------------------------------------+");
		usuario.setNomeUsuario(extraiOpcaoString(input));
		
		System.out.println("+-----------------------------------------------+");
		System.out.println("| Digite o endereço do usuário novo:            |");
		System.out.println("+-----------------------------------------------+");
		usuario.setEnderecoUsuario(extraiOpcaoString(input));
		
		//Cadastro do Usuario
		rn.cadastraUsuario(usuario);
		
		aguardaConfirmacao(input);
		return opcao;
	}

}// Finaliza a classe GeBAUI
